/**
 * 防抖函数
 * @param {Function} func 被执行函数
 * @param {number} [wait] 延迟时间 单位ms 默认2000
 * @param {boolean} [immediate] 立即执行 默认false
 */
export function debounce(func, wait = 2000, immediate = true) {
  let timer, context, args
  // 延迟执行函数
  const later = () =>
    setTimeout(() => {
      // 延迟函数执行完毕，清空缓存的定时器序号
      timer = null
      // 延迟执行的情况下，函数会在延迟函数中执行
      // 使用到之前缓存的参数和上下文
      if (!immediate) {
        func.apply(context, args)
        context = args = null
      }
    }, wait)

  // 这里返回的函数是每次实际调用的函数
  return function (...params) {
    // 如果没有创建延迟执行函数（later），就创建一个
    if (!timer) {
      timer = later()
      // 如果是立即执行，调用函数
      // 否则缓存参数和调用上下文
      if (immediate) {
        func.apply(this, params)
      } else {
        context = this
        args = params
      }
      // 如果已有延迟执行函数（later），调用的时候清除原来的并重新设定一个
      // 这样做延迟函数会重新计时
    } else {
      clearTimeout(timer)
      timer = later()
    }
  }
}

/**
 * 节流函数
 * @param {Function} func
 * @param {number} delay
 */
export function throttle(func, delay = 2000) {
  let lastCall = 0

  return function (...args) {
    const now = Date.now()
    if (now - lastCall >= delay) {
      lastCall = now
      func.apply(this, args)
    }
  }
}

/**
 * 获取当前时间
 *
 * 返回格式如：2023-01-01
 * @param {string} sep 分隔符 默认为 -
 */
export function getDate(sep = '-') {
  const date = new Date()
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const transfer = num => (num < 10 ? `0${num}` : `${num}`)

  return year + sep + transfer(month) + sep + transfer(day)
}

/**
 * 字符串替换
 *
 * 手机号码替换中间四位为*
 * @param {string} str
 */
export function replaceStr(str) {
  if (typeof str !== 'string') return str
  return str.replace(
    /^(.{3})(.*)(.{4})$/,
    (_, prefix, middle, suffix) => prefix + '*'.repeat(middle.length) + suffix
  )
}

/**
 * 图片预览
 */
export function previewImage(params, current = 0) {
  uni.previewImage({
    urls: typeof params === 'string' ? [params] : params,
    current,
    fail: function () {
      uni.showToast({
        title: '图片预览失败，请重试',
        icon: 'none'
      })
    }
  })
}

export function uploadFile(filePath) {
  return new Promise((resolve, reject) => {
    const options = {
      url: import.meta.env.VITE_REQUEST_BASE_URL + '/api/pub/uploadImg',
      timeout: 60000,
      name: 'file',
      filePath
    }
    uni
      .uploadFile(options)
      .then(res => {
        if (res.statusCode === 200) {
          const { code, msg, data } = JSON.parse(res.data)
          if (code !== 10000) {
            uni.showToast({
              title: msg,
              icon: 'none',
              duration: 1800
            })
            reject(res.data)
          }
          resolve(data)
        } else {
          uni.showToast({
            title: '网络开小差了~',
            icon: 'none'
          })
          reject(res.data)
        }
      })
      .catch(err => {
        uni.showToast({
          title: err.errMsg,
          icon: 'none'
        })
        reject(err)
      })
  })
}

/**
 * 是否是一个JSON字符串
 *
 * @param {string} str
 */
export function isJSONString(str) {
  try {
    JSON.parse(str)
    return true
  } catch (_) {
    return false
  }
}

/**
 * 获取url参数
 *
 * @param {string} url
 */
export function getURLQuery(url) {
  const query = url.split('?')[1]
  if (!query) return {}
  const params = query.split('&')
  const temp = {}
  for (const param of params) {
    const arr = param.split('=')
    temp[arr[0]] = arr[1]
  }
  return temp
}
